package com.fudan.backend.service;

import com.fudan.backend.pojo.User;
import com.fudan.backend.exception.RetCode;
import com.github.pagehelper.PageInfo;

public interface UserService {
    /**
     * 实现用户登录功能
     *
     * @param username 用户名
     * @param password 密码
     * @return 登录成功返回USER_SUCCESS，用户名不存在返回USERNAME_ERROR, 密码错误返回PASSWORD_ERROR
     */
    RetCode login(String username, String password);

    /**
     * 通过userId获取用户信息
     *
     * @param userId 用户id
     * @return 返回对应User
     */
    User getUserByUserId(String userId);

    /**
     * @param current  当前页码
     * @param pagesize 页面大小
     * @return 页面信息
     */
    PageInfo<User> getAllUserByPage(int current, int pagesize);

    /**
     * 实现用户注册
     *
     * @param user 注册用户信息
     * @return USER_SUCCESS 注册成功，
     * USERNAME_EXISTS 用户名重复，
     * PHONE_NUM_EXISTS 手机号重复，
     * ID_CARD_NUM_EXISTS 身份证号重复，
     * EMAIL_EXISTS 邮箱重复
     */
    RetCode signUp(User user);

    /**
     * 按用户名查找用户
     *
     * @param username 用户名
     * @return 若存在返回对应User，不存在返回null
     */
    User getUserByUsername(String username);

    /**
     * 判断user内容格式的合法性
     *
     * @return USER_SUCCESS 格式合法
     * NULL_USER 空对象
     * USERNAME_FORMAT_ERROR 用户名不符合
     * PHONE_NUM_FORMAT_ERROR 手机号不符合
     * ID_CARD_NUM_FORMAT_ERROR 身份证号码不符合
     * EMAIL_FORMAT_ERROR 邮箱不符合
     */
    RetCode checkUserFormat(User user);

    /**
     * 更改密码
     * @param userId 用户id
     * @param oldPassword 原密码
     * @param newPassword 新密码
     * @return USER_SUCCESS 成功
     *         USER_ID_NOT_FOUND 用户id不存在
     *         PASSWORD_ERROR 密码错误
     *         PASSWORD_CHANGE_FAILURE 更改失败，可能由于新旧密码相同
     */
    RetCode changePassword(String userId, String oldPassword, String newPassword);

    /**
     * 更新用户信息
     * @param user 用户信息
     * @return USER_SUCCESS 格式合法
     *         NULL_USER 空对象
     *         USERNAME_FORMAT_ERROR 用户名不符合
     *         PHONE_NUM_FORMAT_ERROR 手机号不符合
     *         ID_CARD_NUM_FORMAT_ERROR 身份证号码不符合
     *         EMAIL_FORMAT_ERROR 邮箱不符合
     */
    RetCode updateUserInfo(User user);

}
